from django.http import HttpResponse
from django.db.models import Q

# Create your views here.
def index(request):

    #这里实现增删改查
    books = BookInfo.objects.all()
    print(books)
    return HttpResponse('index')

##########增加数据##################
from book.models import BookInfo
#方式1
book=BookInfo(
    name='Django',
    pub_date='2025-1-1',
    readcount=10
)
#方式1 必要要调用对象的save方法，才能将数据保存到数据库中

#####方式2
#object -- 相当于代理，实现增删改查
#
BookInfo.objects.create(
    name='测试开发入门',
    pub_date='2026-1-1',
    readcount=100
)

##########修改数据##########

#方式1
#select * from book_info where id = 6
BookInfo.objects.get(
    id = 6
)
#想要保存数据，需要调用对象的save方法
book.name='运维开发入门'

#方式2
BookInfo.objects.filter(id=6).update(name='爬虫入门',commentcount=666)


##########删除数据#########
book = BookInfo.objects.get(id=6)
#删除分为物理删除（这条记录的数据删除）
#逻辑删除（修改标记为 例如 is_delete=False）
book.delete()

book = BookInfo.objects.get(id=6).delete()
BookInfo.objects.filter(id=5).delete()

##########查询###########
# get查询单一结果，如果不存在会抛出模型类.DoesNotExist异常。
#
try:
    book=BookInfo.objects.get(id=1)
except BookInfo.DoesNotExist:
    print('查询结果不存在')
# all查询多个结果。
#
BookInfo.objects.all()
from book.models import PeopleInfo
PeopleInfo.objects.all()
# count查询结果数量。
BookInfo.objects.all().count()
BookInfo.objects.count()

##########过滤查询#########
# 实现SQL中的where功能，包括
#
# filter过滤出多个结果
# exclude排除掉符合条件剩下的结果
# get过滤单一结果

# 模型类名.objects.filter(属性名_运算符=值) 获取n个结果 n=0，1，2.。。。
# 模型类名.objects.exclude(属性名_运算符=值) 获取n个结果 n=1，2，3，。。。
# 模型类名.objects.get(属性名_运算符=值)   获取1个结果 或者 显示异常

# 查询编号为1的图书
book = BookInfo.objects.get(id=1)  #简写形式（属性名=值）
book = BookInfo.objects.get(id__exact = 1)  #(完整形式)

BookInfo.objects.get(pk=1) #pk primary key主键

BookInfo.objects.get(id=1)
BookInfo.objects.filter(id=1)
# 查询书名包含'湖'的图书
BookInfo.objects.filter(name__contains='湖')
# 查询书名以'部'结尾的图书
BookInfo.objects.filter(name__endswith='部')
# 查询书名为空的图书
BookInfo.objects.filter(name__isnull=True)
# 查询编号为1或3或5的图书
BookInfo.objects.filter(id__in=[1,3,5])
# 查询编号大于3的图书
#大于gt
#大于等于gte
#小于lt
#小于等于lte
BookInfo.objects.filter(id__gt=3)
#查询编号不等于3的书籍
BookInfo.objects.exclude(id=3)
BookInfo.objects.filter(~Q(id__gt=3))
# 查询1980年发表的图书
BookInfo.objects.filter(pub_date__year=1980)
# 查询1990年1月1日后发表的图书
BookInfo.objects.filter(pub_date__gt='1990-1-1')

#########################
from django.db.models import F
#使用：2个属性的比较
#语法形式：以filter为例 模型类名object.filter(属性名_预算符=F('第二个属性名'))

# 查询阅读量大于等于评论量的图书
BookInfo.objects.filter(readcount__gte=F('commentcount'))

# 并且查询
# 查询阅读量大于20，并且编号小于3的图书。
BookInfo.objects.filter(readcount__gt=20).filter(id__lt=3)

BookInfo.objects.filter(readcount__gt=20,id__lt=3)

#或者查询
# 查询阅读量大于20，或者编号小于3的图书。
from django.db.models import Q
#或者语法：模型类名.bjects.filter(Q(属性民__运算符=值)|Q(属性民__运算符=值)....)
BookInfo.objects.filter(Q(readcount__gt=20)|Q(id__lt=3))
#并且语法:


####################聚合函数##################
from django.db.models import Sum,Max,Min,Avg,Count
#模型类名.objects.aggregate(Xxx('字段名'))

BookInfo.objects.aggregate(Sum('readcount'))

#######排序##############升序
BookInfo.objects.all().order_by('readcount')
#降序
BookInfo.objects.all().order_by('-readcount')


##################2个表的级联操作#############
#查询书籍为1的所有人物信息

#获取了id为1的书籍
book = BookInfo.objects.get(id=1)
book.peopleinfo_set.all().count()
PeopleInfo.objects.filter(book=1)

#查询人物为1的书籍信息
person = PeopleInfo.objects.get(id=1)
person.book.name
person.book.readcount


###########关联过滤查询#######

# 语法形式
# 查询1的数据，条件为n的数据
# 模型类名.objects.(关联模型类名小写__字段名__运算符=值)
# 查询图书，要求图书人物为“郭靖”
BookInfo.objects.filter(peopleinfo__name__exact='郭靖')
BookInfo.objects.filter(peopleinfo__name='郭靖')
# 查询图书，要求人物的描述中包含“八”
BookInfo.objects.filter(peopleinfo__description__contains='八')


# 查询书名为‘天龙八部’的所有人物
PeopleInfo.objects.filter(book__name='天龙八部')
PeopleInfo.objects.filter(book__name__exact='天龙八部')
# 查询图书阅读两大于30的所有人物
PeopleInfo.objects.filter(book__readcount__gt=30)
